package com.haiyou.data.common.accessor.redis.task;

import org.redisson.api.*;

import com.haiyou.data.common.cache.redis.redisson.RedisRedisson;

/**
 * 分布式任务
 *
 * @Author: Jim
 * @Date: 2022/1/28 16:07
 */
public class CronTask {

    /**
     * 分布式环境下 不被多节点重复执行的定时任务
     *
     * @param dbType        对应redisClient
     * @param taskName      任务名称    建议用枚举统一管理
     * @param cron          cron表达式 ex： 0 * * * * ?
     * @param runnable      TaskRunnable 任务
     */
    public static void buildCronTask(String dbType, String taskName, String cron, TaskRunnable runnable) {
        RedissonClient redissonClient = RedisRedisson.getRedissonClient(dbType);
        RScheduledExecutorService myExecutor = redissonClient.getExecutorService(taskName, ExecutorOptions.defaults());
        myExecutor.getTaskIds().forEach(myExecutor::cancelTask);
        myExecutor.registerWorkers(WorkerOptions.defaults());
        myExecutor.schedule(runnable,  CronSchedule.of(cron));
    }

}

